<?php

// 没有命名空间的 php文件里，可以使用 facade 机制。
// use Illuminate\Support\Facades\Route;
// use Illuminate\Support\Facades\Log;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

/*
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
 */

/*
419 Page Expired
post 请求时，如果发生这个情况，基本是 app\Http\Kernel.php 中的
\App\Http\Middleware\VerifyCsrfToken::class,
导致的。

Allowed memory size of 134217728 bytes exhausted (tried to allocate 67112960 bytes)
打印 Request $request 时如果发生这个情况，
你可以通过修改php.ini文件中的memory_limit设置来增加PHP脚本的内存限制。例如，将内存限制设置为128MB或更高：
memory_limit = 128M
也可以临时解决：
ini_set('memory_limit', '256M');
*/


Route::get('/', function () {
    return view('welcome');
});

// 当前登录用户的信息
Route::get('user', function () {
    // 可以直接使用 Auth，这是因为 config/app.php 中的 aliases：
    // 'Auth' => Illuminate\Support\Facades\Auth::class,
    $id = Auth::id();
    $user = Auth::user();
    // return json_encode([
    //         'id' => $id,
    //         'check' => Auth::check(),
    //         'user' => $user
    //     ]);
    pre([
            'id' => $id,
            'check' => Auth::check(),
            'user' => $user
        ]);
    /*
    用户登录时验证用户是否存在、密码是否正确、用户是否激活等
    $credentials = $request->only('email', 'password');
    Auth::attempt($credentials)
    也可以
    Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])
    还可以使用指定的看守器来验证
    Auth::guard('admin')->attempt($credentials)

    登录时，是否 记住我（$remember 布尔值）
    Auth::attempt(['email' => $email, 'password' => $password], $remember)
    是否使用了 记住我
    Auth::viaRemember()

    认证该用户（表示该用户已经登录该应用了）
    Auth::login($user);
    认证该用户 且 记住我
    Auth::login($user, true);
    Auth::guard('admin')->login($user);

    使用 id 来认证用户
    Auth::loginUsingId(1);
    Auth::loginUsingId(1, true);

    单次认证（在单次请求中将用户登录到应用中。这样做将不使用 session 或 cookies，这意味着此方法有助于构建一个无状态 API）
    Auth::once($credentials

    用户退出（它会清除用户会话（session）中的用户验证信息）
    Auth::logout();
     */
});
Route::get('user2', function (Illuminate\Http\Request $request) {
    $id = Auth::id();
    // $request->user() 和 Auth::user() 一样。
    $user = $request->user();
    return json_encode([
            'id' => $id,
            'user' => $user
        ]);
});

Route::get('user/{id}', 'UserController@show');
Route::get('user/edit/{id}', function () {
    // return view('greeting', ['name' => 'James']);
    return 'user/edit/{id}';
});


// http://laravel7120.jumpcity.cm/foo
// 页面显示 Hello World。
Route::get('foo', function () {
    $message = "Hello Foo Bar.";
    Log::emergency($message);
    Log::alert($message);
    Log::critical($message);
    Log::error($message);
    Log::warning($message);
    Log::notice($message);
    Log::info($message);
    Log::debug($message);

    Log::warning('env(\'APP_NAME\', \'default_value\') '. env('APP_NAME', 'default_value'));
    Log::warning('config(\'app.debug\') '. config('app.debug'));

    Log::warning('base_path() '. base_path());
    Log::warning('resource_path() '. resource_path());
    Log::warning('public_path() '. public_path());
    Log::warning('storage_path() '. storage_path());
    /*
    env('APP_NAME', 'default_value') Laravel7.12.0
    config('app.debug') 1
    base_path() E:\study\study-php-laravel\app71202
    resource_path() E:\study\study-php-laravel\app71202\resources
    public_path() E:\study\study-php-laravel\app71202\public
    storage_path() E:\study\study-php-laravel\app71202\storage
 */
    return 'Hello World';
});

// 向页面传递数据
// 1、全局。app\Providers\AppServiceProvider.php
// use Illuminate\Support\Facades\View;
// boot() 方法内：
// View::share('AppServiceProvider', 'AppServiceProvider.boot()');
// 2、助手函数 view() 的第二个参数 ['name' => 'James']。
// 3、助手函数 view() 的链式调用 ->with('name2', 'Victoria')
Route::get('/welcome2', function () {
    return view('welcome2', ['name' => 'James'])->with('name2', 'Victoria');
});


Route::get('test0', function () {
    /*$user = Auth::user();
    // Call to undefined method App\User::createToken()
    $token = $user->createToken('Token Name')->accessToken;
    var_dump($token);*/
    // var_dump(__('messages.welcome'));// zh/messages.php 中的。
    // var_dump(__('en.hello'));// 失败。
    // var_dump(__('es.hello'));// 失败。
    // var_dump(__('hello'));// zh.json 中的。
    // var_dump(session('status'));
    // $user = Auth::user();
    // var_dump($user->id);
    // var_dump($user->isAdmin());
    // echo strlen($str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
    // for ($i=0; $i < 20; $i++) {
    //     echo random_int(0, 20) . '<br>';
    // }
    return;
});

// 这种是不需要登录，也可以访问。
Route::get('test', 'TestController@index');
// 这种就需要登录才能访问了，如果没有登录则会跳转到登录页面。
Route::get('test2', 'TestController@index')->middleware('auth');
// 基础认证，访问时会弹窗显示输入用户名（默认是 email）和密码，而不再是跳转到登录页面。
Route::get('test3', 'TestController@index')->middleware('auth.basic');


// 如果访问只是返回一个视图，就很简单。
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);


Route::get('address/{id}', 'AddressController@show');
// 下面这个不行，因为会被上面的 'address/{id}' 所拦截。
// Route::get('address/all11', 'AddressController@all11');
Route::get('address', 'AddressController@list');
Route::post('address', 'AddressController@add');
Route::put('address', 'AddressController@update');
Route::delete('address/{id}', 'AddressController@delete');

Route::get('region', 'RegionController@index');


// 资源控制器的路由
Route::resource('photos', 'PhotoController');
// 也可以批量
// Route::resources([
//     'tags' => 'TagController',
//     'categories' => 'CategoryController',
//     'posts' => 'PostController',
//     'video' => 'VideoController',
// ]);

// middleware('auth') 不能用于 Route::resources，前面后面都不行。

// 但可以使用这种方式
Route::middleware(['auth'])->group(function () {
    Route::resources([
        'tags' => 'TagController',
        'categories' => 'CategoryController',
        'posts' => 'PostController',
        'video' => 'VideoController',
    ]);
});


/**
 * auv
 * auv@qq.com
 * 1qaz#EDC
 */
Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
